package com.lenl.datastruct.recursion;

/**
 * @author Lenl
 * @version v1.0
 * @create 2022-04-30 11:36
 * @description 迷宫回溯问题
 */
public class MiGong {

    public static void main(String[] args) {
        //创建一个二维数组，模拟迷宫
        //地图
        int[][] map=new int[8][7];
        //使用1表示墙
        //上下全部置为1
        for (int i=0;i<7;i++){
            map[0][i]=1;
            map[7][i]=1;
        }
        //左右全部置为1
        for (int i=0;i<8;i++){
            map[i][0]=1;
            map[i][6]=1;
        }
        //挡板
        map[3][1]=1;
        map[3][2]=1;
        map[2][2]=1;

        //输出地图
        System.out.println("地图：");
        for(int i=0;i<8;i++){
            for(int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println("");
        }
        //使用递归回溯找路
        setWay(map,1,1);
        System.out.println("走过的地图：");
        for(int i=0;i<8;i++){
            for(int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println("");
        }

    }

    /**
     * 使用递归回溯给小球找路
     * 说明:小球能到【6,5】，则表明通路找到
     * 当map[i][j]为0时表示未走，1表示墙，2表示通路，可以走，3表示该点已经走过，但是走不通
     * 策略：下-右-上-左 走不通就回溯
     * @param map 地图
     * @param i 从哪个位置开始
     * @param j 从哪个位置开始
     * @return 找到通路，返回true
     */
    public static boolean setWay(int[][] map,int i, int j){
        if(map[6][5]==2){
            //通路已找到
            return true;
        }else{
            if(map[i][j]==0){
                ///表示还没走过，按策略走
                map[i][j]=2;
                if(setWay(map,i+1,j)){
                    //向下走能走通
                    return true;
                }else if(setWay(map,i,j+1)){
                    //向右走
                    return true;
                }else if(setWay(map,i-1,j)){
                    //向上
                    return true;
                }else if(setWay(map,i,j-1)){
                    return true;
                }else{
                    //该点走不通，是死路
                    map[i][j]=3;
                    return false;
                }
            }else{
                return false;
            }
        }
    }




}
